#ifndef UI_MESSAGE_H
#define UI_MESSAGE_H

#include <pthread.h>
#include <stdbool.h>
#include "lvgl/lvgl.h"

typedef enum {
    MSG_UPDATE_LABEL_TEXT,    // 更新标签文本
    MSG_UPDATE_LABEL_STYLE,   // 更新标签样式
    MSG_UPDATE_IMAGE_SRC,     // 更新图片资源
    MSG_SHOW_OBJECT,         // 显示对象
    MSG_HIDE_OBJECT,         // 隐藏对象
    MSG_CREATE_OBJECT,       // 创建对象
    MSG_DELETE_OBJECT,       // 删除对象
    MSG_ASYNC_CALLBACK,       // 异步回调
    MSG_UPDATE_WEATHER_TEMP  // 天气温度消息
} UIMessageType;

// 消息基类
typedef struct {
    UIMessageType type;
    lv_obj_t* target;        // 目标对象
    void (*free_fn)(void*);  // 自定义释放函数
} UIMessageBase;

// 更新标签文本消息
typedef struct {
    UIMessageBase base;
    char* text;              // 文本内容(需要复制)
} UILabelUpdateMsg;

// 更新样式消息
typedef struct {
    UIMessageBase base;
    lv_style_t* style;       // 样式指针
    lv_part_t part;         // 样式部分
    lv_state_t state;       // 状态
} UIStyleUpdateMsg;

// 异步回调消息
typedef struct {
    UIMessageBase base;
    void (*callback)(void*); // 回调函数
    void* user_data;         // 用户数据
} UIAsyncCallbackMsg;


// 线程安全消息队列
typedef struct {
    UIMessageBase** messages;  // 消息指针数组
    size_t capacity;          // 队列容量
    size_t head;              // 队列头
    size_t tail;              // 队列尾
    size_t count;             // 当前消息数
    pthread_mutex_t lock;     // 互斥锁
    pthread_cond_t not_empty; // 非空条件变量
    pthread_cond_t not_full;  // 非满条件变量
} ThreadSafeUIMessageQueue;

// 初始化消息队列
void ui_message_queue_init(ThreadSafeUIMessageQueue* queue, size_t capacity);

// 销毁消息队列
void ui_message_queue_destroy(ThreadSafeUIMessageQueue* queue);

// 推送消息到队列(线程安全)
bool ui_message_queue_push(ThreadSafeUIMessageQueue* queue, UIMessageBase* msg);

// 从队列取出消息(线程安全)
UIMessageBase* ui_message_queue_pop(ThreadSafeUIMessageQueue* queue);
UIMessageBase* ui_message_queue_try_pop(ThreadSafeUIMessageQueue* queue);

// 创建更新标签消息
UILabelUpdateMsg* create_label_update_msg(lv_obj_t* target, const char* text);

// 创建样式更新消息
UIStyleUpdateMsg* create_style_update_msg(lv_obj_t* target, lv_style_t* style, lv_part_t part, lv_state_t state);

// 创建异步回调消息
UIAsyncCallbackMsg* create_async_callback_msg(void (*callback)(void*), void* user_data);

bool ui_message_queue_push_timeout(ThreadSafeUIMessageQueue* queue, UIMessageBase* msg, int timeout_ms);
void ui_message_send(UIMessageBase* msg);

#endif // UI_MESSAGE_H